]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
workspace: Position windows only when needed
authorJasper St. Pierre <jstpierre@mecheye.net>
Wed, 8 Aug 2012 17:16:28 +0000 (14:16 -0300)
committerJasper St. Pierre <jstpierre@mecheye.net>
Mon, 20 Aug 2012 22:22:49 +0000 (18:22 -0400)
Right now, when entering the overview, we compute the window slots about
four or five times, from scratch each time. Move to a queued system where
extraneous calls to positionWindows don't matter.

https://bugzilla.gnome.org/show_bug.cgi?id=582650

js/ui/workspace.js

index 8e75cd8d231c8a96317b3ebeb2d680f5bae4e9b4..cff9a4278623399c7c0976d4f8bf79dd391d2eb5 100644 (file)
@@ -726,6 +726,9 @@ const Workspace = new Lang.Class({
         this._repositionWindowsId = 0;
 
         this.leavingOverview = false;
+
+        this._positionWindowsFlags = 0;
+        this._positionWindowsId = 0;
     },
 
     setGeometry: function(x, y, width, height) {
@@ -734,15 +737,13 @@ const Workspace = new Lang.Class({
         this._width = width;
         this._height = height;
 
-        // This is sometimes called during allocation, so we do this later
-        Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
-            function () {
-                this._dropRect.set_position(x, y);
-                this._dropRect.set_size(width, height);
-                this.positionWindows(WindowPositionFlags.ANIMATE);
-                return false;
-            }));
+        Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
+            this._dropRect.set_position(x, y);
+            this._dropRect.set_size(width, height);
+            return false;
+        }));
 
+        this.positionWindows(WindowPositionFlags.ANIMATE);
     },
 
     _lookupIndex: function (metaWindow) {
@@ -1003,7 +1004,21 @@ const Workspace = new Lang.Class({
      *  INITIAL - this is the initial positioning of the windows.
      *  ANIMATE - Indicates that we need animate changing position.
      */
-    positionWindows : function(flags) {
+    positionWindows: function(flags) {
+        this._positionWindowsFlags |= flags;
+
+        if (this._positionWindowsId > 0)
+            return;
+
+        this._positionWindowsId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
+            this._realPositionWindows(this._positionWindowsFlags);
+            this._positionWindowsFlags = 0;
+            this._positionWindowsId = 0;
+            return false;
+        }));
+    },
+
+    _realPositionWindows : function(flags) {
         if (this._repositionWindowsId > 0) {
             Mainloop.source_remove(this._repositionWindowsId);
             this._repositionWindowsId = 0;
@@ -1372,6 +1387,9 @@ const Workspace = new Lang.Class({
         if (this._repositionWindowsId > 0)
             Mainloop.source_remove(this._repositionWindowsId);
 
+        if (this._positionWindowsId > 0)
+            Meta.later_remove(this._positionWindowsId);
+
         // Usually, the windows will be destroyed automatically with
         // their parent (this.actor), but we might have a zoomed window
         // which has been reparented to the stage - _windows[0] holds